home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / python2.5 / distutils / ccompiler.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-29  |  39KB  |  986 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. '''distutils.ccompiler
  5.  
  6. Contains CCompiler, an abstract base class that defines the interface
  7. for the Distutils compiler abstraction model.'''
  8. __revision__ = '$Id: ccompiler.py 46331 2006-05-26 14:07:23Z bob.ippolito $'
  9. import sys
  10. import os
  11. import re
  12. from types import *
  13. from copy import copy
  14. from distutils.errors import *
  15. from distutils.spawn import spawn
  16. from distutils.file_util import move_file
  17. from distutils.dir_util import mkpath
  18. from distutils.dep_util import newer_pairwise, newer_group
  19. from distutils.util import split_quoted, execute
  20. from distutils import log
  21.  
  22. class CCompiler:
  23.     '''Abstract base class to define the interface that must be implemented
  24.     by real compiler classes.  Also has some utility methods used by
  25.     several compiler classes.
  26.  
  27.     The basic idea behind a compiler abstraction class is that each
  28.     instance can be used for all the compile/link steps in building a
  29.     single project.  Thus, attributes common to all of those compile and
  30.     link steps -- include directories, macros to define, libraries to link
  31.     against, etc. -- are attributes of the compiler instance.  To allow for
  32.     variability in how individual files are treated, most of those
  33.     attributes may be varied on a per-compilation or per-link basis.
  34.     '''
  35.     compiler_type = None
  36.     src_extensions = None
  37.     obj_extension = None
  38.     static_lib_extension = None
  39.     shared_lib_extension = None
  40.     static_lib_format = None
  41.     shared_lib_format = None
  42.     exe_extension = None
  43.     language_map = {
  44.         '.c': 'c',
  45.         '.cc': 'c++',
  46.         '.cpp': 'c++',
  47.         '.cxx': 'c++',
  48.         '.m': 'objc' }
  49.     language_order = [
  50.         'c++',
  51.         'objc',
  52.         'c']
  53.     
  54.     def __init__(self, verbose = 0, dry_run = 0, force = 0):
  55.         self.dry_run = dry_run
  56.         self.force = force
  57.         self.verbose = verbose
  58.         self.output_dir = None
  59.         self.macros = []
  60.         self.include_dirs = []
  61.         self.libraries = []
  62.         self.library_dirs = []
  63.         self.runtime_library_dirs = []
  64.         self.objects = []
  65.         for key in self.executables.keys():
  66.             self.set_executable(key, self.executables[key])
  67.         
  68.  
  69.     
  70.     def set_executables(self, **args):
  71.         """Define the executables (and options for them) that will be run
  72.         to perform the various stages of compilation.  The exact set of
  73.         executables that may be specified here depends on the compiler
  74.         class (via the 'executables' class attribute), but most will have:
  75.           compiler      the C/C++ compiler
  76.           linker_so     linker used to create shared objects and libraries
  77.           linker_exe    linker used to create binary executables
  78.           archiver      static library creator
  79.  
  80.         On platforms with a command-line (Unix, DOS/Windows), each of these
  81.         is a string that will be split into executable name and (optional)
  82.         list of arguments.  (Splitting the string is done similarly to how
  83.         Unix shells operate: words are delimited by spaces, but quotes and
  84.         backslashes can override this.  See
  85.         'distutils.util.split_quoted()'.)
  86.         """
  87.         for key in args.keys():
  88.             if not self.executables.has_key(key):
  89.                 raise ValueError, "unknown executable '%s' for class %s" % (key, self.__class__.__name__)
  90.             
  91.             self.set_executable(key, args[key])
  92.         
  93.  
  94.     
  95.     def set_executable(self, key, value):
  96.         if type(value) is StringType:
  97.             setattr(self, key, split_quoted(value))
  98.         else:
  99.             setattr(self, key, value)
  100.  
  101.     
  102.     def _find_macro(self, name):
  103.         i = 0
  104.         for defn in self.macros:
  105.             if defn[0] == name:
  106.                 return i
  107.             
  108.             i = i + 1
  109.         
  110.  
  111.     
  112.     def _check_macro_definitions(self, definitions):
  113.         """Ensures that every element of 'definitions' is a valid macro
  114.         definition, ie. either (name,value) 2-tuple or a (name,) tuple.  Do
  115.         nothing if all definitions are OK, raise TypeError otherwise.
  116.         """
  117.         for defn in definitions:
  118.             if type(defn) is TupleType:
  119.                 if len(defn) == 1 or len(defn) == 2:
  120.                     if not (type(defn[1]) is StringType or defn[1] is None) and type(defn[0]) is StringType:
  121.                         raise TypeError, "invalid macro definition '%s': " % defn + 'must be tuple (string,), (string, string), or ' + '(string, None)'
  122.                         continue
  123.         
  124.  
  125.     
  126.     def define_macro(self, name, value = None):
  127.         """Define a preprocessor macro for all compilations driven by this
  128.         compiler object.  The optional parameter 'value' should be a
  129.         string; if it is not supplied, then the macro will be defined
  130.         without an explicit value and the exact outcome depends on the
  131.         compiler used (XXX true? does ANSI say anything about this?)
  132.         """
  133.         i = self._find_macro(name)
  134.         if i is not None:
  135.             del self.macros[i]
  136.         
  137.         defn = (name, value)
  138.         self.macros.append(defn)
  139.  
  140.     
  141.     def undefine_macro(self, name):
  142.         """Undefine a preprocessor macro for all compilations driven by
  143.         this compiler object.  If the same macro is defined by
  144.         'define_macro()' and undefined by 'undefine_macro()' the last call
  145.         takes precedence (including multiple redefinitions or
  146.         undefinitions).  If the macro is redefined/undefined on a
  147.         per-compilation basis (ie. in the call to 'compile()'), then that
  148.         takes precedence.
  149.         """
  150.         i = self._find_macro(name)
  151.         if i is not None:
  152.             del self.macros[i]
  153.         
  154.         undefn = (name,)
  155.         self.macros.append(undefn)
  156.  
  157.     
  158.     def add_include_dir(self, dir):
  159.         """Add 'dir' to the list of directories that will be searched for
  160.         header files.  The compiler is instructed to search directories in
  161.         the order in which they are supplied by successive calls to
  162.         'add_include_dir()'.
  163.         """
  164.         self.include_dirs.append(dir)
  165.  
  166.     
  167.     def set_include_dirs(self, dirs):
  168.         """Set the list of directories that will be searched to 'dirs' (a
  169.         list of strings).  Overrides any preceding calls to
  170.         'add_include_dir()'; subsequence calls to 'add_include_dir()' add
  171.         to the list passed to 'set_include_dirs()'.  This does not affect
  172.         any list of standard include directories that the compiler may
  173.         search by default.
  174.         """
  175.         self.include_dirs = copy(dirs)
  176.  
  177.     
  178.     def add_library(self, libname):
  179.         """Add 'libname' to the list of libraries that will be included in
  180.         all links driven by this compiler object.  Note that 'libname'
  181.         should *not* be the name of a file containing a library, but the
  182.         name of the library itself: the actual filename will be inferred by
  183.         the linker, the compiler, or the compiler class (depending on the
  184.         platform).
  185.  
  186.         The linker will be instructed to link against libraries in the
  187.         order they were supplied to 'add_library()' and/or
  188.         'set_libraries()'.  It is perfectly valid to duplicate library
  189.         names; the linker will be instructed to link against libraries as
  190.         many times as they are mentioned.
  191.         """
  192.         self.libraries.append(libname)
  193.  
  194.     
  195.     def set_libraries(self, libnames):
  196.         """Set the list of libraries to be included in all links driven by
  197.         this compiler object to 'libnames' (a list of strings).  This does
  198.         not affect any standard system libraries that the linker may
  199.         include by default.
  200.         """
  201.         self.libraries = copy(libnames)
  202.  
  203.     
  204.     def add_library_dir(self, dir):
  205.         """Add 'dir' to the list of directories that will be searched for
  206.         libraries specified to 'add_library()' and 'set_libraries()'.  The
  207.         linker will be instructed to search for libraries in the order they
  208.         are supplied to 'add_library_dir()' and/or 'set_library_dirs()'.
  209.         """
  210.         self.library_dirs.append(dir)
  211.  
  212.     
  213.     def set_library_dirs(self, dirs):
  214.         """Set the list of library search directories to 'dirs' (a list of
  215.         strings).  This does not affect any standard library search path
  216.         that the linker may search by default.
  217.         """
  218.         self.library_dirs = copy(dirs)
  219.  
  220.     
  221.     def add_runtime_library_dir(self, dir):
  222.         """Add 'dir' to the list of directories that will be searched for
  223.         shared libraries at runtime.
  224.         """
  225.         self.runtime_library_dirs.append(dir)
  226.  
  227.     
  228.     def set_runtime_library_dirs(self, dirs):
  229.         """Set the list of directories to search for shared libraries at
  230.         runtime to 'dirs' (a list of strings).  This does not affect any
  231.         standard search path that the runtime linker may search by
  232.         default.
  233.         """
  234.         self.runtime_library_dirs = copy(dirs)
  235.  
  236.     
  237.     def add_link_object(self, object):
  238.         '''Add \'object\' to the list of object files (or analogues, such as
  239.         explicitly named library files or the output of "resource
  240.         compilers") to be included in every link driven by this compiler
  241.         object.
  242.         '''
  243.         self.objects.append(object)
  244.  
  245.     
  246.     def set_link_objects(self, objects):
  247.         """Set the list of object files (or analogues) to be included in
  248.         every link to 'objects'.  This does not affect any standard object
  249.         files that the linker may include by default (such as system
  250.         libraries).
  251.         """
  252.         self.objects = copy(objects)
  253.  
  254.     
  255.     def _setup_compile(self, outdir, macros, incdirs, sources, depends, extra):
  256.         '''Process arguments and decide which source files to compile.
  257.  
  258.         Merges _fix_compile_args() and _prep_compile().
  259.         '''
  260.         if outdir is None:
  261.             outdir = self.output_dir
  262.         elif type(outdir) is not StringType:
  263.             raise TypeError, "'output_dir' must be a string or None"
  264.         
  265.         if macros is None:
  266.             macros = self.macros
  267.         elif type(macros) is ListType:
  268.             if not self.macros:
  269.                 pass
  270.             macros = macros + []
  271.         else:
  272.             raise TypeError, "'macros' (if supplied) must be a list of tuples"
  273.         if incdirs is None:
  274.             incdirs = self.include_dirs
  275.         elif type(incdirs) in (ListType, TupleType):
  276.             if not self.include_dirs:
  277.                 pass
  278.             incdirs = list(incdirs) + []
  279.         else:
  280.             raise TypeError, "'include_dirs' (if supplied) must be a list of strings"
  281.         if extra is None:
  282.             extra = []
  283.         
  284.         objects = self.object_filenames(sources, strip_dir = 0, output_dir = outdir)
  285.         if not len(objects) == len(sources):
  286.             raise AssertionError
  287.         if self.force:
  288.             skip_source = { }
  289.             for source in sources:
  290.                 skip_source[source] = 0
  291.             
  292.         elif depends is None:
  293.             skip_source = { }
  294.             for source in sources:
  295.                 skip_source[source] = 1
  296.             
  297.             (n_sources, n_objects) = newer_pairwise(sources, objects)
  298.             for source in n_sources:
  299.                 skip_source[source] = 0
  300.             
  301.         else:
  302.             skip_source = { }
  303.             L = depends[:] + [
  304.                 None]
  305.             for i in range(len(objects)):
  306.                 source = sources[i]
  307.                 L[-1] = source
  308.                 if newer_group(L, objects[i]):
  309.                     skip_source[source] = 0
  310.                     continue
  311.                 skip_source[source] = 1
  312.             
  313.         pp_opts = gen_preprocess_options(macros, incdirs)
  314.         build = { }
  315.         for i in range(len(sources)):
  316.             src = sources[i]
  317.             obj = objects[i]
  318.             ext = os.path.splitext(src)[1]
  319.             self.mkpath(os.path.dirname(obj))
  320.             if skip_source[src]:
  321.                 log.debug('skipping %s (%s up-to-date)', src, obj)
  322.                 continue
  323.             build[obj] = (src, ext)
  324.         
  325.         return (macros, objects, extra, pp_opts, build)
  326.  
  327.     
  328.     def _get_cc_args(self, pp_opts, debug, before):
  329.         cc_args = pp_opts + [
  330.             '-c']
  331.         if debug:
  332.             cc_args[:0] = [
  333.                 '-g']
  334.         
  335.         if before:
  336.             cc_args[:0] = before
  337.         
  338.         return cc_args
  339.  
  340.     
  341.     def _fix_compile_args(self, output_dir, macros, include_dirs):
  342.         """Typecheck and fix-up some of the arguments to the 'compile()'
  343.         method, and return fixed-up values.  Specifically: if 'output_dir'
  344.         is None, replaces it with 'self.output_dir'; ensures that 'macros'
  345.         is a list, and augments it with 'self.macros'; ensures that
  346.         'include_dirs' is a list, and augments it with 'self.include_dirs'.
  347.         Guarantees that the returned values are of the correct type,
  348.         i.e. for 'output_dir' either string or None, and for 'macros' and
  349.         'include_dirs' either list or None.
  350.         """
  351.         if output_dir is None:
  352.             output_dir = self.output_dir
  353.         elif type(output_dir) is not StringType:
  354.             raise TypeError, "'output_dir' must be a string or None"
  355.         
  356.         if macros is None:
  357.             macros = self.macros
  358.         elif type(macros) is ListType:
  359.             if not self.macros:
  360.                 pass
  361.             macros = macros + []
  362.         else:
  363.             raise TypeError, "'macros' (if supplied) must be a list of tuples"
  364.         if include_dirs is None:
  365.             include_dirs = self.include_dirs
  366.         elif type(include_dirs) in (ListType, TupleType):
  367.             if not self.include_dirs:
  368.                 pass
  369.             include_dirs = list(include_dirs) + []
  370.         else:
  371.             raise TypeError, "'include_dirs' (if supplied) must be a list of strings"
  372.         return (output_dir, macros, include_dirs)
  373.  
  374.     
  375.     def _prep_compile(self, sources, output_dir, depends = None):
  376.         """Decide which souce files must be recompiled.
  377.  
  378.         Determine the list of object files corresponding to 'sources',
  379.         and figure out which ones really need to be recompiled.
  380.         Return a list of all object files and a dictionary telling
  381.         which source files can be skipped.
  382.         """
  383.         objects = self.object_filenames(sources, output_dir = output_dir)
  384.         if not len(objects) == len(sources):
  385.             raise AssertionError
  386.         if self.force:
  387.             skip_source = { }
  388.             for source in sources:
  389.                 skip_source[source] = 0
  390.             
  391.         elif depends is None:
  392.             skip_source = { }
  393.             for source in sources:
  394.                 skip_source[source] = 1
  395.             
  396.             (n_sources, n_objects) = newer_pairwise(sources, objects)
  397.             for source in n_sources:
  398.                 skip_source[source] = 0
  399.             
  400.         else:
  401.             skip_source = { }
  402.             L = depends[:] + [
  403.                 None]
  404.             for i in range(len(objects)):
  405.                 source = sources[i]
  406.                 L[-1] = source
  407.                 if newer_group(L, objects[i]):
  408.                     skip_source[source] = 0
  409.                     continue
  410.                 skip_source[source] = 1
  411.             
  412.         return (objects, skip_source)
  413.  
  414.     
  415.     def _fix_object_args(self, objects, output_dir):
  416.         """Typecheck and fix up some arguments supplied to various methods.
  417.         Specifically: ensure that 'objects' is a list; if output_dir is
  418.         None, replace with self.output_dir.  Return fixed versions of
  419.         'objects' and 'output_dir'.
  420.         """
  421.         if type(objects) not in (ListType, TupleType):
  422.             raise TypeError, "'objects' must be a list or tuple of strings"
  423.         
  424.         objects = list(objects)
  425.         if output_dir is None:
  426.             output_dir = self.output_dir
  427.         elif type(output_dir) is not StringType:
  428.             raise TypeError, "'output_dir' must be a string or None"
  429.         
  430.         return (objects, output_dir)
  431.  
  432.     
  433.     def _fix_lib_args(self, libraries, library_dirs, runtime_library_dirs):
  434.         """Typecheck and fix up some of the arguments supplied to the
  435.         'link_*' methods.  Specifically: ensure that all arguments are
  436.         lists, and augment them with their permanent versions
  437.         (eg. 'self.libraries' augments 'libraries').  Return a tuple with
  438.         fixed versions of all arguments.
  439.         """
  440.         if libraries is None:
  441.             libraries = self.libraries
  442.         elif type(libraries) in (ListType, TupleType):
  443.             if not self.libraries:
  444.                 pass
  445.             libraries = list(libraries) + []
  446.         else:
  447.             raise TypeError, "'libraries' (if supplied) must be a list of strings"
  448.         if library_dirs is None:
  449.             library_dirs = self.library_dirs
  450.         elif type(library_dirs) in (ListType, TupleType):
  451.             if not self.library_dirs:
  452.                 pass
  453.             library_dirs = list(library_dirs) + []
  454.         else:
  455.             raise TypeError, "'library_dirs' (if supplied) must be a list of strings"
  456.         if runtime_library_dirs is None:
  457.             runtime_library_dirs = self.runtime_library_dirs
  458.         elif type(runtime_library_dirs) in (ListType, TupleType):
  459.             if not self.runtime_library_dirs:
  460.                 pass
  461.             runtime_library_dirs = list(runtime_library_dirs) + []
  462.         else:
  463.             raise TypeError, "'runtime_library_dirs' (if supplied) " + 'must be a list of strings'
  464.         return (libraries, library_dirs, runtime_library_dirs)
  465.  
  466.     
  467.     def _need_link(self, objects, output_file):
  468.         """Return true if we need to relink the files listed in 'objects'
  469.         to recreate 'output_file'.
  470.         """
  471.         if self.force:
  472.             return 1
  473.         elif self.dry_run:
  474.             newer = newer_group(objects, output_file, missing = 'newer')
  475.         else:
  476.             newer = newer_group(objects, output_file)
  477.         return newer
  478.  
  479.     
  480.     def detect_language(self, sources):
  481.         '''Detect the language of a given file, or list of files. Uses
  482.         language_map, and language_order to do the job.
  483.         '''
  484.         if type(sources) is not ListType:
  485.             sources = [
  486.                 sources]
  487.         
  488.         lang = None
  489.         index = len(self.language_order)
  490.         for source in sources:
  491.             (base, ext) = os.path.splitext(source)
  492.             extlang = self.language_map.get(ext)
  493.             
  494.             try:
  495.                 extindex = self.language_order.index(extlang)
  496.                 if extindex < index:
  497.                     lang = extlang
  498.                     index = extindex
  499.             continue
  500.             except ValueError:
  501.                 continue
  502.             
  503.  
  504.         
  505.         return lang
  506.  
  507.     
  508.     def preprocess(self, source, output_file = None, macros = None, include_dirs = None, extra_preargs = None, extra_postargs = None):
  509.         """Preprocess a single C/C++ source file, named in 'source'.
  510.         Output will be written to file named 'output_file', or stdout if
  511.         'output_file' not supplied.  'macros' is a list of macro
  512.         definitions as for 'compile()', which will augment the macros set
  513.         with 'define_macro()' and 'undefine_macro()'.  'include_dirs' is a
  514.         list of directory names that will be added to the default list.
  515.  
  516.         Raises PreprocessError on failure.
  517.         """
  518.         pass
  519.  
  520.     
  521.     def compile(self, sources, output_dir = None, macros = None, include_dirs = None, debug = 0, extra_preargs = None, extra_postargs = None, depends = None):
  522.         '''Compile one or more source files.
  523.  
  524.         \'sources\' must be a list of filenames, most likely C/C++
  525.         files, but in reality anything that can be handled by a
  526.         particular compiler and compiler class (eg. MSVCCompiler can
  527.         handle resource files in \'sources\').  Return a list of object
  528.         filenames, one per source filename in \'sources\'.  Depending on
  529.         the implementation, not all source files will necessarily be
  530.         compiled, but all corresponding object filenames will be
  531.         returned.
  532.  
  533.         If \'output_dir\' is given, object files will be put under it, while
  534.         retaining their original path component.  That is, "foo/bar.c"
  535.         normally compiles to "foo/bar.o" (for a Unix implementation); if
  536.         \'output_dir\' is "build", then it would compile to
  537.         "build/foo/bar.o".
  538.  
  539.         \'macros\', if given, must be a list of macro definitions.  A macro
  540.         definition is either a (name, value) 2-tuple or a (name,) 1-tuple.
  541.         The former defines a macro; if the value is None, the macro is
  542.         defined without an explicit value.  The 1-tuple case undefines a
  543.         macro.  Later definitions/redefinitions/ undefinitions take
  544.         precedence.
  545.  
  546.         \'include_dirs\', if given, must be a list of strings, the
  547.         directories to add to the default include file search path for this
  548.         compilation only.
  549.  
  550.         \'debug\' is a boolean; if true, the compiler will be instructed to
  551.         output debug symbols in (or alongside) the object file(s).
  552.  
  553.         \'extra_preargs\' and \'extra_postargs\' are implementation- dependent.
  554.         On platforms that have the notion of a command-line (e.g. Unix,
  555.         DOS/Windows), they are most likely lists of strings: extra
  556.         command-line arguments to prepand/append to the compiler command
  557.         line.  On other platforms, consult the implementation class
  558.         documentation.  In any event, they are intended as an escape hatch
  559.         for those occasions when the abstract compiler framework doesn\'t
  560.         cut the mustard.
  561.  
  562.         \'depends\', if given, is a list of filenames that all targets
  563.         depend on.  If a source file is older than any file in
  564.         depends, then the source file will be recompiled.  This
  565.         supports dependency tracking, but only at a coarse
  566.         granularity.
  567.  
  568.         Raises CompileError on failure.
  569.         '''
  570.         (macros, objects, extra_postargs, pp_opts, build) = self._setup_compile(output_dir, macros, include_dirs, sources, depends, extra_postargs)
  571.         cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)
  572.         for obj in objects:
  573.             
  574.             try:
  575.                 (src, ext) = build[obj]
  576.             except KeyError:
  577.                 continue
  578.  
  579.             self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
  580.         
  581.         return objects
  582.  
  583.     
  584.     def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
  585.         """Compile 'src' to product 'obj'."""
  586.         pass
  587.  
  588.     
  589.     def create_static_lib(self, objects, output_libname, output_dir = None, debug = 0, target_lang = None):
  590.         '''Link a bunch of stuff together to create a static library file.
  591.         The "bunch of stuff" consists of the list of object files supplied
  592.         as \'objects\', the extra object files supplied to
  593.         \'add_link_object()\' and/or \'set_link_objects()\', the libraries
  594.         supplied to \'add_library()\' and/or \'set_libraries()\', and the
  595.         libraries supplied as \'libraries\' (if any).
  596.  
  597.         \'output_libname\' should be a library name, not a filename; the
  598.         filename will be inferred from the library name.  \'output_dir\' is
  599.         the directory where the library file will be put.
  600.  
  601.         \'debug\' is a boolean; if true, debugging information will be
  602.         included in the library (note that on most platforms, it is the
  603.         compile step where this matters: the \'debug\' flag is included here
  604.         just for consistency).
  605.  
  606.         \'target_lang\' is the target language for which the given objects
  607.         are being compiled. This allows specific linkage time treatment of
  608.         certain languages.
  609.  
  610.         Raises LibError on failure.
  611.         '''
  612.         pass
  613.  
  614.     SHARED_OBJECT = 'shared_object'
  615.     SHARED_LIBRARY = 'shared_library'
  616.     EXECUTABLE = 'executable'
  617.     
  618.     def link(self, target_desc, objects, output_filename, output_dir = None, libraries = None, library_dirs = None, runtime_library_dirs = None, export_symbols = None, debug = 0, extra_preargs = None, extra_postargs = None, build_temp = None, target_lang = None):
  619.         '''Link a bunch of stuff together to create an executable or
  620.         shared library file.
  621.  
  622.         The "bunch of stuff" consists of the list of object files supplied
  623.         as \'objects\'.  \'output_filename\' should be a filename.  If
  624.         \'output_dir\' is supplied, \'output_filename\' is relative to it
  625.         (i.e. \'output_filename\' can provide directory components if
  626.         needed).
  627.  
  628.         \'libraries\' is a list of libraries to link against.  These are
  629.         library names, not filenames, since they\'re translated into
  630.         filenames in a platform-specific way (eg. "foo" becomes "libfoo.a"
  631.         on Unix and "foo.lib" on DOS/Windows).  However, they can include a
  632.         directory component, which means the linker will look in that
  633.         specific directory rather than searching all the normal locations.
  634.  
  635.         \'library_dirs\', if supplied, should be a list of directories to
  636.         search for libraries that were specified as bare library names
  637.         (ie. no directory component).  These are on top of the system
  638.         default and those supplied to \'add_library_dir()\' and/or
  639.         \'set_library_dirs()\'.  \'runtime_library_dirs\' is a list of
  640.         directories that will be embedded into the shared library and used
  641.         to search for other shared libraries that *it* depends on at
  642.         run-time.  (This may only be relevant on Unix.)
  643.  
  644.         \'export_symbols\' is a list of symbols that the shared library will
  645.         export.  (This appears to be relevant only on Windows.)
  646.  
  647.         \'debug\' is as for \'compile()\' and \'create_static_lib()\', with the
  648.         slight distinction that it actually matters on most platforms (as
  649.         opposed to \'create_static_lib()\', which includes a \'debug\' flag
  650.         mostly for form\'s sake).
  651.  
  652.         \'extra_preargs\' and \'extra_postargs\' are as for \'compile()\' (except
  653.         of course that they supply command-line arguments for the
  654.         particular linker being used).
  655.  
  656.         \'target_lang\' is the target language for which the given objects
  657.         are being compiled. This allows specific linkage time treatment of
  658.         certain languages.
  659.  
  660.         Raises LinkError on failure.
  661.         '''
  662.         raise NotImplementedError
  663.  
  664.     
  665.     def link_shared_lib(self, objects, output_libname, output_dir = None, libraries = None, library_dirs = None, runtime_library_dirs = None, export_symbols = None, debug = 0, extra_preargs = None, extra_postargs = None, build_temp = None, target_lang = None):
  666.         self.link(CCompiler.SHARED_LIBRARY, objects, self.library_filename(output_libname, lib_type = 'shared'), output_dir, libraries, library_dirs, runtime_library_dirs, export_symbols, debug, extra_preargs, extra_postargs, build_temp, target_lang)
  667.  
  668.     
  669.     def link_shared_object(self, objects, output_filename, output_dir = None, libraries = None, library_dirs = None, runtime_library_dirs = None, export_symbols = None, debug = 0, extra_preargs = None, extra_postargs = None, build_temp = None, target_lang = None):
  670.         self.link(CCompiler.SHARED_OBJECT, objects, output_filename, output_dir, libraries, library_dirs, runtime_library_dirs, export_symbols, debug, extra_preargs, extra_postargs, build_temp, target_lang)
  671.  
  672.     
  673.     def link_executable(self, objects, output_progname, output_dir = None, libraries = None, library_dirs = None, runtime_library_dirs = None, debug = 0, extra_preargs = None, extra_postargs = None, target_lang = None):
  674.         self.link(CCompiler.EXECUTABLE, objects, self.executable_filename(output_progname), output_dir, libraries, library_dirs, runtime_library_dirs, None, debug, extra_preargs, extra_postargs, None, target_lang)
  675.  
  676.     
  677.     def library_dir_option(self, dir):
  678.         """Return the compiler option to add 'dir' to the list of
  679.         directories searched for libraries.
  680.         """
  681.         raise NotImplementedError
  682.  
  683.     
  684.     def runtime_library_dir_option(self, dir):
  685.         """Return the compiler option to add 'dir' to the list of
  686.         directories searched for runtime libraries.
  687.         """
  688.         raise NotImplementedError
  689.  
  690.     
  691.     def library_option(self, lib):
  692.         """Return the compiler option to add 'dir' to the list of libraries
  693.         linked into the shared library or executable.
  694.         """
  695.         raise NotImplementedError
  696.  
  697.     
  698.     def has_function(self, funcname, includes = None, include_dirs = None, libraries = None, library_dirs = None):
  699.         '''Return a boolean indicating whether funcname is supported on
  700.         the current platform.  The optional arguments can be used to
  701.         augment the compilation environment.
  702.         '''
  703.         import tempfile as tempfile
  704.         if includes is None:
  705.             includes = []
  706.         
  707.         if include_dirs is None:
  708.             include_dirs = []
  709.         
  710.         if libraries is None:
  711.             libraries = []
  712.         
  713.         if library_dirs is None:
  714.             library_dirs = []
  715.         
  716.         (fd, fname) = tempfile.mkstemp('.c', funcname, text = True)
  717.         f = os.fdopen(fd, 'w')
  718.         for incl in includes:
  719.             f.write('#include "%s"\n' % incl)
  720.         
  721.         f.write('main (int argc, char **argv) {\n    %s();\n}\n' % funcname)
  722.         f.close()
  723.         
  724.         try:
  725.             objects = self.compile([
  726.                 fname], include_dirs = include_dirs)
  727.         except CompileError:
  728.             return False
  729.  
  730.         
  731.         try:
  732.             self.link_executable(objects, 'a.out', libraries = libraries, library_dirs = library_dirs)
  733.         except (LinkError, TypeError):
  734.             return False
  735.  
  736.         return True
  737.  
  738.     
  739.     def find_library_file(self, dirs, lib, debug = 0):
  740.         """Search the specified list of directories for a static or shared
  741.         library file 'lib' and return the full path to that file.  If
  742.         'debug' true, look for a debugging version (if that makes sense on
  743.         the current platform).  Return None if 'lib' wasn't found in any of
  744.         the specified directories.
  745.         """
  746.         raise NotImplementedError
  747.  
  748.     
  749.     def object_filenames(self, source_filenames, strip_dir = 0, output_dir = ''):
  750.         if output_dir is None:
  751.             output_dir = ''
  752.         
  753.         obj_names = []
  754.         for src_name in source_filenames:
  755.             (base, ext) = os.path.splitext(src_name)
  756.             base = os.path.splitdrive(base)[1]
  757.             base = base[os.path.isabs(base):]
  758.             if ext not in self.src_extensions:
  759.                 raise UnknownFileError, "unknown file type '%s' (from '%s')" % (ext, src_name)
  760.             
  761.             if strip_dir:
  762.                 base = os.path.basename(base)
  763.             
  764.             obj_names.append(os.path.join(output_dir, base + self.obj_extension))
  765.         
  766.         return obj_names
  767.  
  768.     
  769.     def shared_object_filename(self, basename, strip_dir = 0, output_dir = ''):
  770.         if not output_dir is not None:
  771.             raise AssertionError
  772.         if strip_dir:
  773.             basename = os.path.basename(basename)
  774.         
  775.         return os.path.join(output_dir, basename + self.shared_lib_extension)
  776.  
  777.     
  778.     def executable_filename(self, basename, strip_dir = 0, output_dir = ''):
  779.         if not output_dir is not None:
  780.             raise AssertionError
  781.         if strip_dir:
  782.             basename = os.path.basename(basename)
  783.         
  784.         if not self.exe_extension:
  785.             pass
  786.         return os.path.join(output_dir, basename + '')
  787.  
  788.     
  789.     def library_filename(self, libname, lib_type = 'static', strip_dir = 0, output_dir = ''):
  790.         if not output_dir is not None:
  791.             raise AssertionError
  792.         if lib_type not in ('static', 'shared', 'dylib'):
  793.             raise ValueError, '\'lib_type\' must be "static", "shared" or "dylib"'
  794.         
  795.         fmt = getattr(self, lib_type + '_lib_format')
  796.         ext = getattr(self, lib_type + '_lib_extension')
  797.         (dir, base) = os.path.split(libname)
  798.         filename = fmt % (base, ext)
  799.         if strip_dir:
  800.             dir = ''
  801.         
  802.         return os.path.join(output_dir, dir, filename)
  803.  
  804.     
  805.     def announce(self, msg, level = 1):
  806.         log.debug(msg)
  807.  
  808.     
  809.     def debug_print(self, msg):
  810.         DEBUG = DEBUG
  811.         import distutils.debug
  812.         if DEBUG:
  813.             print msg
  814.         
  815.  
  816.     
  817.     def warn(self, msg):
  818.         sys.stderr.write('warning: %s\n' % msg)
  819.  
  820.     
  821.     def execute(self, func, args, msg = None, level = 1):
  822.         execute(func, args, msg, self.dry_run)
  823.  
  824.     
  825.     def spawn(self, cmd):
  826.         spawn(cmd, dry_run = self.dry_run)
  827.  
  828.     
  829.     def move_file(self, src, dst):
  830.         return move_file(src, dst, dry_run = self.dry_run)
  831.  
  832.     
  833.     def mkpath(self, name, mode = 511):
  834.         mkpath(name, mode, self.dry_run)
  835.  
  836.  
  837. _default_compilers = (('cygwin.*', 'unix'), ('os2emx', 'emx'), ('posix', 'unix'), ('nt', 'msvc'), ('mac', 'mwerks'))
  838.  
  839. def get_default_compiler(osname = None, platform = None):
  840.     ''' Determine the default compiler to use for the given platform.
  841.  
  842.         osname should be one of the standard Python OS names (i.e. the
  843.         ones returned by os.name) and platform the common value
  844.         returned by sys.platform for the platform in question.
  845.  
  846.         The default values are os.name and sys.platform in case the
  847.         parameters are not given.
  848.  
  849.     '''
  850.     if osname is None:
  851.         osname = os.name
  852.     
  853.     if platform is None:
  854.         platform = sys.platform
  855.     
  856.     for pattern, compiler in _default_compilers:
  857.         if re.match(pattern, platform) is not None or re.match(pattern, osname) is not None:
  858.             return compiler
  859.             continue
  860.     
  861.     return 'unix'
  862.  
  863. compiler_class = {
  864.     'unix': ('unixccompiler', 'UnixCCompiler', 'standard UNIX-style compiler'),
  865.     'msvc': ('msvccompiler', 'MSVCCompiler', 'Microsoft Visual C++'),
  866.     'cygwin': ('cygwinccompiler', 'CygwinCCompiler', 'Cygwin port of GNU C Compiler for Win32'),
  867.     'mingw32': ('cygwinccompiler', 'Mingw32CCompiler', 'Mingw32 port of GNU C Compiler for Win32'),
  868.     'bcpp': ('bcppcompiler', 'BCPPCompiler', 'Borland C++ Compiler'),
  869.     'mwerks': ('mwerkscompiler', 'MWerksCompiler', 'MetroWerks CodeWarrior'),
  870.     'emx': ('emxccompiler', 'EMXCCompiler', 'EMX port of GNU C Compiler for OS/2') }
  871.  
  872. def show_compilers():
  873.     '''Print list of available compilers (used by the "--help-compiler"
  874.     options to "build", "build_ext", "build_clib").
  875.     '''
  876.     FancyGetopt = FancyGetopt
  877.     import distutils.fancy_getopt
  878.     compilers = []
  879.     for compiler in compiler_class.keys():
  880.         compilers.append(('compiler=' + compiler, None, compiler_class[compiler][2]))
  881.     
  882.     compilers.sort()
  883.     pretty_printer = FancyGetopt(compilers)
  884.     pretty_printer.print_help('List of available compilers:')
  885.  
  886.  
  887. def new_compiler(plat = None, compiler = None, verbose = 0, dry_run = 0, force = 0):
  888.     '''Generate an instance of some CCompiler subclass for the supplied
  889.     platform/compiler combination.  \'plat\' defaults to \'os.name\'
  890.     (eg. \'posix\', \'nt\'), and \'compiler\' defaults to the default compiler
  891.     for that platform.  Currently only \'posix\' and \'nt\' are supported, and
  892.     the default compilers are "traditional Unix interface" (UnixCCompiler
  893.     class) and Visual C++ (MSVCCompiler class).  Note that it\'s perfectly
  894.     possible to ask for a Unix compiler object under Windows, and a
  895.     Microsoft compiler object under Unix -- if you supply a value for
  896.     \'compiler\', \'plat\' is ignored.
  897.     '''
  898.     if plat is None:
  899.         plat = os.name
  900.     
  901.     
  902.     try:
  903.         if compiler is None:
  904.             compiler = get_default_compiler(plat)
  905.         
  906.         (module_name, class_name, long_description) = compiler_class[compiler]
  907.     except KeyError:
  908.         msg = "don't know how to compile C/C++ code on platform '%s'" % plat
  909.         if compiler is not None:
  910.             msg = msg + " with '%s' compiler" % compiler
  911.         
  912.         raise DistutilsPlatformError, msg
  913.  
  914.     
  915.     try:
  916.         module_name = 'distutils.' + module_name
  917.         __import__(module_name)
  918.         module = sys.modules[module_name]
  919.         klass = vars(module)[class_name]
  920.     except ImportError:
  921.         raise DistutilsModuleError, "can't compile C/C++ code: unable to load module '%s'" % module_name
  922.     except KeyError:
  923.         raise DistutilsModuleError, ("can't compile C/C++ code: unable to find class '%s' " + "in module '%s'") % (class_name, module_name)
  924.  
  925.     return klass(None, dry_run, force)
  926.  
  927.  
  928. def gen_preprocess_options(macros, include_dirs):
  929.     """Generate C pre-processor options (-D, -U, -I) as used by at least
  930.     two types of compilers: the typical Unix compiler and Visual C++.
  931.     'macros' is the usual thing, a list of 1- or 2-tuples, where (name,)
  932.     means undefine (-U) macro 'name', and (name,value) means define (-D)
  933.     macro 'name' to 'value'.  'include_dirs' is just a list of directory
  934.     names to be added to the header file search path (-I).  Returns a list
  935.     of command-line options suitable for either Unix compilers or Visual
  936.     C++.
  937.     """
  938.     pp_opts = []
  939.     for macro in macros:
  940.         None if type(macro) is TupleType else 1
  941.         if len(macro) == 2:
  942.             if macro[1] is None:
  943.                 pp_opts.append('-D%s' % macro[0])
  944.             else:
  945.                 pp_opts.append('-D%s=%s' % macro)
  946.         macro[1] is None
  947.     
  948.     for dir in include_dirs:
  949.         pp_opts.append('-I%s' % dir)
  950.     
  951.     return pp_opts
  952.  
  953.  
  954. def gen_lib_options(compiler, library_dirs, runtime_library_dirs, libraries):
  955.     """Generate linker options for searching library directories and
  956.     linking with specific libraries.  'libraries' and 'library_dirs' are,
  957.     respectively, lists of library names (not filenames!) and search
  958.     directories.  Returns a list of command-line options suitable for use
  959.     with some compiler (depending on the two format strings passed in).
  960.     """
  961.     lib_opts = []
  962.     for dir in library_dirs:
  963.         lib_opts.append(compiler.library_dir_option(dir))
  964.     
  965.     for dir in runtime_library_dirs:
  966.         opt = compiler.runtime_library_dir_option(dir)
  967.         if type(opt) is ListType:
  968.             lib_opts = lib_opts + opt
  969.             continue
  970.         lib_opts.append(opt)
  971.     
  972.     for lib in libraries:
  973.         (lib_dir, lib_name) = os.path.split(lib)
  974.         if lib_dir:
  975.             lib_file = compiler.find_library_file([
  976.                 lib_dir], lib_name)
  977.             if lib_file:
  978.                 lib_opts.append(lib_file)
  979.             else:
  980.                 compiler.warn("no library file corresponding to '%s' found (skipping)" % lib)
  981.         lib_file
  982.         lib_opts.append(compiler.library_option(lib))
  983.     
  984.     return lib_opts
  985.  
  986.